package unit04.day05;
/**
 * 同步块
 * 有效的缩小同步范围可以在保证并发安全的同时尽可能提高并发效率
 * @author Administrator
 *
 */
public class SyncDemo2 {

	public static void main(String[] args) {
		Shop shop = new Shop();
		Thread t1 = new Thread() {
			public void run() {
				shop.buy();
			}
		};
		Thread t2 = new Thread() {
			public void run() {
				shop.buy();
			}
		};
		t1.start();
		t2.start();
	}

}

class Shop{
	
	public void buy() {
		Thread t = Thread.currentThread();
		try {
			System.out.println(t+":正在挑衣服");
			Thread.sleep(3000);
			/**
			 * 同步块可以要求多个线程对该块内的代码排队执行，但是前提条件是同步监视器对象
			 * 即(上锁的对象)要求多个线程看到的必须是同一个
			 * synchronized(同步监视器对象){
			 * 		需要同步的代码
			 * }
			 * 所谓同步执行即：多个线程必须排队执行
			 * 所谓异步执行即：多个线程可以同时执行
			 */
			synchronized(this) {
				System.out.println(t+":正在试衣服");
				Thread.sleep(3000);
			}
			System.out.println(t+":正在结账");
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}